'''
paramiko模块：
    作用：实现ssh协议功能
        1） 执行远程命令的功能 ssh root@1.1.1.1 hostname
        2） 实现文件的上传与下载 scp
安装
pip install paramiko
'''
import paramiko, pymysql, sys

#支持连接任意服务器，来执行任意操作

#连接后端数据库，获取ssh连接信息
def get_server_ssh_info_from_Mysql():
    try:
        db_connect = pymysql.connect(host='192.168.7.16', user='admin', password='DD.08.dd', database="test")
    except Exception as e:
        print("数据库连接失败")
        print(e)
        sys.exit()
    # 创建游标，通过游标接收数据库返回的信息
    db_cr = db_connect.cursor()
    sql_test = "select ip, user, password, port from my_table"
    # 这一行执行前面定义的SQL查询语句，并将结果存储在游标对象db_cr中。
    db_cr.execute(sql_test)

    db_cr.close()
    db_connect.close()

    return  db_cr.fetchall()# 返回所有检索结果

def CMD_ssh(ip, user, password, command, port=22):
    # 利用ssh协议创建一个ssh客户端对象，用来连接远程服务器。
    ssh_client = paramiko.SSHClient()
    #设置SSH客户端对象的主机密钥策略。   策略为：自动添加主机策略的密钥
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    # 异常捕获 ，将捕获到的异常简洁明了的输出
    try:
    # 捕获这条语句的异常输出
        ssh_client.connect(hostname=ip, username=user, password=password, port=port)
    except Exception as e:   #Exception(包含所有的异常)
        print("服务器 [%s] ssh连接失败" % ip)
    # 退出这次程序的执行
        sys.exit()
    # 执行命令 #exec_command按顺序依次返回三个文件，标准输入(一般用来和命令进行交互)、标准输出、标准错误
    stdin, stdout, stder = ssh_client.exec_command(command)
    # 将返回的标准输出赋值给一个变量，输出的解码格式为_UTF-8,decode默认使用UTF-8的输出格式
    result = stdout.read().decode()
    # 输出变量
    print(result)
    # 关闭ssh客户端连接
    ssh_client.close()

# if __name__ == '__main__':
#     command = input("输入命令:  ").strip()
#     # 将主机的信息从数据库的搜索结果中检索出来。
#     for ip, user, password, port in  get_server_ssh_info_from_Mysql():
#         print("主机信息：IP地址：%s___用户：%s____" % (ip, user))
#         # 将主机信息传递给CMD_ssh方法然后由方法去执行，得出命令的返回值
#         CMD_ssh(ip=ip, user=user, password=password, command=command,port=port)

#上传、下载文件

#执行远程命令
def ssh_test1():
    # 1、创建一个ssh的客户端     创建处一个相当于xshell的客户端工具
    ssh_client = paramiko.SSHClient()
    # 设置丢失主机密钥的策略
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    # 2、 连接客户端
    ssh_client.connect(hostname='39.101.68.186', username='root', password='DD.08.dd', port=22)
    # 3、执行命令 #exec_command按顺序依次返回三个文件，标准输入(一般用来和命令进行交互)、标准输出、标准错误
    stdin, stdout, stderr = ssh_client.exec_command("free -m")
    result = stdout.read().decode(encoding="UTF-8")
    print(result)

    ssh_client.close()

